package shuati.jianxinhuyu;

/**
 * @author : LdLtd
 * @Date : 2024/4/13
 * @Description:实现一个函数计算出给定数字 n(0 < n < 2000000000)子数列的个数。子数列定义如下:
 * 1.此数列所有项的和等于给定数字n
 * 2.此数列为等差数列
 * 3.此数列所有项都为正整数
 * 4.此数列项个数必须大于或等于3个
 *
 * 例如:
 * 6 只能找到数列(123)，所以它的子数列个数为1
 * 11 找不到，所以它的子数列个数为 0
 * 12能找到数列(345)(246)(147)，所以它的子数列个数为 3
 * 14 能找到数列(2345)，所以它的子数列个数为 1
 */
public class gouzaodengchashulie {
    public static void main(String[] args) {
        System.out.println(countSubsequences(6));
    }
   static int countSubsequences(int n) {
        int count = 0;
        // 循环遍历所有可能的公差
        for (int d = 1; d <= n / 3; ++d) {
            for (int i = 1; i <=d; i++) {
                int start = i, end = start + d;
                while (end < n) {
                    // 计算当前等差数列的项数
                    int numTerms = (end - start) / d + 1;
                    // 计算当前等差数列的和
                    int sum = numTerms * (start + end) / 2;
                    // 如果当前和等于n，计数器加1
                    if (sum == n&&numTerms>2) {
                        count++;
                    }
                    // 如果当前和小于n，移动结束位置指针
                    if (sum < n) {
                        end += d;
                    }
                    // 如果当前和大于n，移动起始位置指针
                    else {
                        start += d;
                    }
                }
            }

        }
        return count;
    }

}
